EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみた

EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみた

Clock Icon2023.05.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ゲームソリューショングループのsoraです。
今回は、EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみたことについて書いていきます。

構成

EC2にKinesis Agentをインストールして、Kinesis Data Firehoseを経由して、S3にログファイルを送信する構成です。

Kinesis Data FirehoseとS3の作成

Kinesis Data FirehoseとS3を作成します。(S3の作成は本記事では割愛します。)
Kinesis Data Firehoseについて、ソースはDirect PUT、送信先はS3として作成したS3を指定します。

EC2の準備

Webサーバの実装

EC2は以下ブログ記事内で作成したものに、アクセスログを出力するように修正したものを使用します。
GoでWebサーバを構築していますが、ApacheやNginxをインストールしたWebサーバでも問題ありません。

Kinesis Data Firehoseへログファイルを送信するため、EC2のIAMロールにはKinesis Data Firehoseへの権限を付与してください。
※間違えやすいポイントとして、IAMポリシーのActionについて、"kinesis"ではなく"firehose"が必要です。

本記事の主題とはずれますが、Goで構築したWebサーバではvar/log/golang-access.logにアクセスログを出力するようなコードにしています。

package main

import (
	"html/template"
	"log"
	"net/http"
	"os"
	"time"
)

func frontHandler(w http.ResponseWriter, r *http.Request) {
	// HTMLファイルのパース処理
	resp, err := template.ParseFiles("front.html")
	if err != nil {
		log.Printf("template error: %v", err)
	}	
	// 値の埋め込み+エラー処理
	if err := resp.Execute(w, nil); err != nil {
		log.Printf("failed to execute template: %v", err)
	}
}

func accessLogHandler(next http.Handler, logger *log.Logger) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		start := time.Now()
		next.ServeHTTP(w, r)
		logger.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
	})
}

func main() {
	// ログファイルのオープン
	logFile, err := os.OpenFile("../../var/log/golang-access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatalf("failed to open log file: %v", err)
	}
	defer logFile.Close()
	// ログ出力先をファイルに設定
	logger := log.New(logFile, "", log.LstdFlags)
	http.HandleFunc("/front", frontHandler)
	// アクセスログを出力するようにミドルウェアを追加
	http.ListenAndServe(":8080", accessLogHandler(http.DefaultServeMux, logger))
	// リクエスト状態の開始
	log.Fatal(http.ListenAndServe(":8080", nil))
}

Kinesis Agentのインストールと設定

EC2にSSHでアクセスして、以下コマンドを実行します。

# Kinesisエージェントのインストール
$ sudo yum install –y aws-kinesis-agent
# Kinesisエージェントの設定ファイルの修正
$ sudo vi /etc/aws-kinesis/agent.json
{
    "cloudwatch.emitMetrics": false,
    "firehose.endpoint": "firehose.ap-northeast-1.amazonaws.com",
    "flows": [
        {
            "filePattern": "<Kinesis Data Firehoseに送るログファイル(今回は/var/log/golang*.log)>",
            "deliveryStream": "<Kinesis Data Firehoseのストリーム名>"
        }
    ]
}

設定ができたため、エージェントを起動します。

sudo service aws-kinesis-agent start

実行結果

EC2を起動してWebページにアクセスした後に、Kinesis Data Firehoseの配信ストリームのメトリクスを確認します。(何度か実行しているため、見づらくてすみません)
※もしKinesis Data Firehoseに正常にログを渡せていなければ、EC2にてvar/log/aws-kinesis-agentにあるログを確認してみると良いです。 S3バケットも確認します。
配置されているオブジェクトをダウンロードして中身を確認してみます。(以下は一部抜粋したものです。)

2023/05/08 03:57:22 GET /front 686.065µs
2023/05/08 03:57:23 GET /favicon.ico 10.823µs
2023/05/08 03:57:24 GET /front 95.378µs
2023/05/08 03:57:25 GET /front 118.908µs
2023/05/08 03:57:25 GET /front 114.536µs
2023/05/08 03:57:25 GET /front 147.352µs
2023/05/08 03:57:26 GET /front 99.988µs
2023/05/08 03:57:26 GET /front 102.057µs
2023/05/08 04:06:30 GET /front 144.725µs

アクセスログがS3に配置できていることが確認できました。

参考ページ

Kinesis エージェントを使用した Kinesis Data Firehose への書き込み

最後に

今回は、EC2にKinesisエージェントをインストールして、Kinesis Data Firehose経由でS3にログファイルを送信してみたことを記事にしました。
どなたかの参考になると幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.